#ifndef SUDOKUCELL_H
#define SUDOKUCELL_H

#include <QWidget>
#include <vector>
#include <map>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QResizeEvent>
#include "sudokucellsignals.h"
#include "sudoku_ui_global.h"

namespace sudoku_ui {


    /**
     * @brief The SudokuCell class  数独游戏中单元格
     */
    class SUDOKU_UI_EXPORT SudokuCell : public QWidget
    {
        Q_OBJECT
    public:
        explicit SudokuCell(QWidget *parent = nullptr);
        explicit SudokuCell(int index, QWidget * parent = nullptr);
        explicit SudokuCell(int row, int col, QWidget * parent = nullptr);
        /**
         * @brief ~SudokuCell   析构函数
         */
        virtual ~SudokuCell();

        /**
         * @brief setValue  没有提示时设置单元格的值
         * @param value
         */
        void setValue(int value = 0);

        /**
         * @brief value     获取单元格的值
         * @return
         */
        int value() const;

        /**
         * @brief index     获取在九宫格中的索引值
         * @return
         */
        int index() const;

        /**
         * @brief row       行号
         * @return
         */
        int row() const;

        /**
         * @brief col       列号
         * @return
         */
        int col() const;

        /**
         * @brief updateValue   更新提示值，如果value值存在，则删除该值，否则添加该值
         * @param value
         */
        void updateValue(int value);

        /**
         * @brief clearValue    清除提示数值
         */
        void clearHintValue();

        /**
         * @brief setSame
         * @param flag
         */
        void setSame(bool flag = false);

        /**
         * @brief setFixed
         * @param fixed
         */
        void setFixed(bool fixed = false);

        /**
         * @brief setBackColor  设置背景颜色
         * @param color
         */
        static void setBackColor(const QColor& color);

        /**
         * @brief backColor     获取背景颜色
         * @return
         */
        static const QColor& backColor();

        /**
         * @brief globalInitColors  初始化所有值的颜色
         */
        static void globalInitColors();

        /**
         * @brief globalSetColor    设置值对应的颜色值
         * @param value
         * @param color
         */
        static void globalSetColor(int value, const QColor& color);

        /**
         * @brief globalColor       获取对应值的颜色值
         * @param value
         * @return
         */
        static const QColor& globalColor(int value);

        /**
         * @brief globalSetSelectedColor    设置选中颜色
         * @param color
         */
        static void globalSetSelectedColor(const QColor& color);

        /**
         * @brief globalSelectedColor   获取选中颜色
         * @return
         */
        static const QColor& globalSelectedColor();

        /**
         * @brief globalSetDefaultColor 设置默认颜色值
         * @param color
         */
        static void globalSetDefaultColor(const QColor& color);

        /**
         * @brief globalDefaultColor    获取默认颜色值
         * @return
         */
        static const QColor& globalDefaultColor();

    private:
        int m_value{0};
        std::vector<int> m_values;
        int m_index{0};

        int m_row{0};
        int m_col{0};

        bool m_focus{false};
        bool m_mouseClicked{false};

        /**
         * @brief m_same
         */
        bool m_same{false};

        /**
         * @brief m_fixed   该单元格是否会被修改
         */
        bool m_fixed{false};

        static QColor g_backColor;
        static std::map<int, QColor> g_colors;
        static QColor g_selectedColor;
        static QColor g_defaultColor;
        static QColor g_sameColor;

    signals:

        // QWidget interface
    protected:
        void mousePressEvent(QMouseEvent *event) override;
        void enterEvent(QEvent *event) override;
        void leaveEvent(QEvent *event) override;
        void paintEvent(QPaintEvent *event) override;
        void resizeEvent(QResizeEvent *event) override;

    public slots:
        void unSelect();
    };

}

#endif // SUDOKUCELL_H
